package com.hhf.cloud.service.impl;

import com.hhf.cloud.apis.AccountFeignApi;
import com.hhf.cloud.apis.StorageFeignApi;
import com.hhf.cloud.entities.DtxOrder;
import com.hhf.cloud.entities.Order;
import com.hhf.cloud.mapper.DtxOrderMapper;
import com.hhf.cloud.service.OrderTccService;
import lombok.extern.slf4j.Slf4j;
import org.apache.seata.core.context.RootContext;
import org.apache.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

/**
 * @author Daniel-黄海峰
 * @Description
 * @create 2024/3/2 22:16
 */
@Service
@Slf4j
public class OrderTccServiceImpl implements OrderTccService {
    @Autowired
    private DtxOrderMapper dtxOrderMapper;

    @Autowired
    private AccountFeignApi accountFeignApi;

    @Autowired
    private StorageFeignApi storageFeignApi;

    /**
     * TCC模式下的创建订单
     * 订单可以用AT模式，而账户微服务以及库存微服务则使用TCC模式
     *
     * @param order 订单对象
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    @GlobalTransactional(timeoutMills = 36000000, rollbackFor = Exception.class)
    public DtxOrder createTCC(DtxOrder order) {
        String xid = RootContext.getXID();
        log.info("==================>开始新建订单,xid:{},订单状态为1", xid);

        order.setStatus(0);
        int result = dtxOrderMapper.insertSelective(order);

        // 插入订单成功后获得插入mysql的实体对象
        DtxOrder orderFromDB = null;

        if (result > 0) {
            orderFromDB = dtxOrderMapper.selectOne(order);
            log.info("-------> 新建订单成功，orderFromDB: {}", orderFromDB);

            log.info("-------> order服务开始调用storage服务，做扣减count");
            storageFeignApi.decreaseTcc(orderFromDB.getProductId(), orderFromDB.getCount());
            log.info("-------> order服务结束调用storage服务，做扣减完成");

            log.info("-------> order服务开始调用account服务，做扣减money");
            accountFeignApi.decreaseTcc(orderFromDB.getUserId(), orderFromDB.getMoney());
            log.info("-------> order服务结束调用account服务，做扣减完成");

            log.info("-------> 修改订单状态为1");
            orderFromDB.setStatus(1);

            Example whereCondition = new Example(Order.class);
            Example.Criteria criteria = whereCondition.createCriteria();
            criteria.andEqualTo("userId", orderFromDB.getUserId());
            criteria.andEqualTo("status", 0);

            int updateResult = dtxOrderMapper.updateByExampleSelective(orderFromDB, whereCondition);

            log.info("-------> 修改订单状态完成返回值: {}", updateResult);

//            int age = 10/0;
        }

        log.info("==================>结束新建订单,xid:{}", xid);
        return orderFromDB;
    }
}
